package br.com.webcrm.dao.impl;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import br.com.webcrm.dao.EntidadeDAO;
import br.com.webcrm.model.Entidade;
import br.com.webcrm.model.constants.ConsultaAtivoConst;

@Repository(value = "entidadeDAO")
public class EntidadeDAOImpl extends BaseDAOImpl<Entidade, Integer> implements
		EntidadeDAO {

	@Autowired
	public EntidadeDAOImpl(@Qualifier("sessionFactory") SessionFactory factory) {
		super.setSessionFactory(factory);
	}

	@Override
	public List<Entidade> consultarPorNome(String nomeEntidade, Integer situacao) {

		if (situacao == ConsultaAtivoConst.CONSTULTA_ATIVO) {
			String[] nomes = { "nomeEntidade", "ativo" };
			Object[] valores = { nomeEntidade, new Boolean(true) };
			return (List<Entidade>) this.consultarPorNamedQueryEParametros(
					"Entidade.findByNomeEntidadeAndAtivo", nomes, valores);
		}
		if (situacao == ConsultaAtivoConst.CONSTULTA_INATIVO) {
			String[] nomes = { "nomeEntidade", "ativo" };
			Object[] valores = { nomeEntidade, new Boolean(false) };
			return (List<Entidade>) this.consultarPorNamedQueryEParametros(
					"Entidade.findByNomeEntidadeAndAtivo", nomes, valores);
		}
		if (situacao == ConsultaAtivoConst.CONSTULTA_AMBOS) {
			String[] nomes = { "nomeEntidade" };
			Object[] valores = { nomeEntidade };
			return (List<Entidade>) this.consultarPorNamedQueryEParametros(
					"Entidade.findByNomeEntidade", nomes, valores);
		}
		return null;
	}

	@Override
	public List<Entidade> consultarPorCpfCnpj(Integer valor, Integer situacao) {
		if (situacao == ConsultaAtivoConst.CONSTULTA_ATIVO) {
			String[] nomes = { "cpfCnpj", "ativo" };
			Object[] valores = { valor, new Boolean(true) };
			return (List<Entidade>) this.consultarPorNamedQueryEParametros(
					"Entidade.findByCpfCnpjAndAtivo", nomes, valores);
		}
		if (situacao == ConsultaAtivoConst.CONSTULTA_INATIVO) {
			String[] nomes = { "cpfCnpj", "ativo" };
			Object[] valores = { valor, new Boolean(false) };
			return (List<Entidade>) this.consultarPorNamedQueryEParametros(
					"Entidade.findByCpfCnpjAndAtivo", nomes, valores);
		}
		if (situacao == ConsultaAtivoConst.CONSTULTA_AMBOS) {
			String[] nomes = { "cpfCnpj" };
			Object[] valores = { valor };
			return (List<Entidade>) this.consultarPorNamedQueryEParametros(
					"Entidade.findByCpfCnpj", nomes, valores);
		}
		return null;
	}

	@Override
	public List<Entidade> consultarPorNomeFantasia(String nomeFantasia,	Integer situacao) {
		if (situacao == ConsultaAtivoConst.CONSTULTA_ATIVO){
			String[] nomes = { "nomeFantasia", "ativo" };			
			Object[] valores = {nomeFantasia, new Boolean(true)};
			return (List<Entidade>) this.consultarPorNamedQueryEParametros("Entidade.findByNomeFantasiaAndAtivo", nomes, valores);
		}
		if (situacao == ConsultaAtivoConst.CONSTULTA_INATIVO){
			String[] nomes = { "nomeFantasia", "ativo" };			
			Object[] valores = {nomeFantasia, new Boolean(false)};
			return (List<Entidade>) this.consultarPorNamedQueryEParametros("Entidade.findByNomeFantasiaAndAtivo", nomes, valores);
		}
		if (situacao == ConsultaAtivoConst.CONSTULTA_AMBOS){
			String[] nomes = { "nomeFantasia" };			
			Object[] valores = {nomeFantasia};
			return (List<Entidade>) this.consultarPorNamedQueryEParametros("Entidade.findByNomeFantasia", nomes, valores);
		}
		return null;
	}

	@Override
	public List<Entidade> consultarPorIdEntidade(Integer idEntidade) {
		String[] nomes = { "idEntidade" };			
		Object[] valores = {idEntidade};
		return this.consultarPorNamedQueryEParametros("Entidade.findByIdEntidade", nomes, valores);
	}

	
	@Override
	public List<Entidade> consultarTodos() {
		return this.consultarTudo();
	}

}
